﻿using System.Collections;
namespace VoxelBlock
{
    /// <summary>
    /// 一个byte保存8个Bool
    /// </summary>
    public class ByteTo8Bool
    {
        const byte byte0 = 1;
        const byte byte1 = 2;
        const byte byte2 = 4;
        const byte byte3 = 8;
        const byte byte4 = 16;
        const byte byte5 = 32;
        const byte byte6 = 64;
        const byte byte7 = 128;

        const byte _byte0 = 254;
        const byte _byte1 = 253;
        const byte _byte2 = 251;
        const byte _byte3 = 247;
        const byte _byte4 = 239;
        const byte _byte5 = 223;
        const byte _byte6 = 191;
        const byte _byte7 = 127;

        byte m_byte;


        public byte SetValue(byte value)
        {
            return m_byte = value;
        }

        public byte GetValue()
        {
            return m_byte;
        }


        public ByteTo8Bool(bool isAllBool)
        {
            if (isAllBool)
            {
                m_byte = 255;
            }
            else
            {
                m_byte = 0;
            }
        }

        /// <summary>
        /// 是否都为False
        /// </summary>
        /// <returns>如果有一个变量为ture，那么返回ture</returns>
        public bool IsAllFalse()
        {
            if (m_byte == 0)
            {
                return false;
            }
            return true;
        }

        public bool this[int index]
        {
            get
            {
                switch (index)
                {
                    case 0:
                        return Bool0;
                    case 1:
                        return Bool1;
                    case 2:
                        return Bool2;
                    case 3:
                        return Bool3;
                    case 4:
                        return Bool4;
                    case 5:
                        return Bool5;
                    case 6:
                        return Bool6;
                    case 7:
                        return Bool7;
                }
                return Bool0;
            }

            set
            {
                switch (index)
                {
                    case 0:
                         Bool0 = value;
                        break;
                    case 1:
                        Bool1 = value;
                        break;
                    case 2:
                        Bool2 = value;
                        break;
                    case 3:
                        Bool3 = value;
                        break;
                    case 4:
                        Bool4 = value;
                        break;
                    case 5:
                        Bool5 = value;
                        break;
                    case 6:
                        Bool6 = value;
                        break;
                    case 7:
                        Bool7 = value;
                        break;
                }
            }

        }
        public IEnumerator GetEnumerator()
        {
            yield return Bool0;
            yield return Bool1;
            yield return Bool2;
            yield return Bool3;
            yield return Bool4;
            yield return Bool5;
            yield return Bool6;
            yield return Bool7;
        }
        public bool Bool0
        {
            set
            {
                if (value)
                {
                    m_byte = (byte)(m_byte | byte0);
                }
                else
                {
                    m_byte = (byte)(m_byte & _byte0);
                }
            }
            get
            {
                if ((m_byte & byte0) == 0)
                {
                    return false;
                }
                return true;
            }
        }
        public bool Bool1
        {
            set
            {
                if (value)
                {
                    m_byte = (byte)(m_byte | byte1);
                }
                else
                {
                    m_byte = (byte)(m_byte & _byte1);
                }
            }
            get
            {
                if ((m_byte & byte1) == 0)
                {
                    return false;
                }
                return true;
            }
        }
        public bool Bool2
        {
            set
            {
                if (value)
                {
                    m_byte = (byte)(m_byte | byte2);
                }
                else
                {
                    m_byte = (byte)(m_byte & _byte2);
                }
            }
            get
            {
                if ((m_byte & byte2) == 0)
                {
                    return false;
                }
                return true;
            }
        }
        public bool Bool3
        {
            set
            {
                if (value)
                {
                    m_byte = (byte)(m_byte | byte3);
                }
                else
                {
                    m_byte = (byte)(m_byte & _byte3);
                }
            }
            get
            {
                if ((m_byte & byte3) == 0)
                {
                    return false;
                }
                return true;
            }
        }
        public bool Bool4
        {
            set
            {
                if (value)
                {
                    m_byte = (byte)(m_byte | byte4);
                }
                else
                {
                    m_byte = (byte)(m_byte & _byte4);
                }
            }
            get
            {
                if ((m_byte & byte4) == 0)
                {
                    return false;
                }
                return true;
            }
        }
        public bool Bool5
        {
            set
            {
                if (value)
                {
                    m_byte = (byte)(m_byte | byte5);
                }
                else
                {
                    m_byte = (byte)(m_byte & _byte5);
                }
            }
            get
            {
                if ((m_byte & byte5) == 0)
                {
                    return false;
                }
                return true;
            }
        }
        public bool Bool6
        {
            set
            {
                if (value)
                {
                    m_byte = (byte)(m_byte | byte6);
                }
                else
                {
                    m_byte = (byte)(m_byte & _byte6);
                }
            }
            get
            {
                if ((m_byte & byte6) == 0)
                {
                    return false;
                }
                return true;
            }
        }
        public bool Bool7
        {
            set
            {
                if (value)
                {
                    m_byte = (byte)(m_byte | byte7);
                }
                else
                {
                    m_byte = (byte)(m_byte & _byte7);
                }
            }
            get
            {
                if ((m_byte & byte7) == 0)
                {
                    return false;
                }
                return true;
            }
        }

        public override string ToString()
        {
            return System.Convert.ToString(m_byte, 2);
        }

    }
}